import 'package:flutter/material.dart';
/*
对于父widget来说，管理状态并告诉子widget何时更新通常是比较好的昂是。
以下示例，TapboxB通过回调将其状态导出到其父组件，状态由父组件管理，所以
父组件是StatefulWidget,TapboxB不管理任何状态，为StatelessWidget

ParenttWidgetState类：
1.为TapboxB管理_active状态
2.实现_handleTapboxChanged(),当盒子被点击时调用的方法
3.当状态改变时，调用setState（）更新ui

TapboxB类：
1.继承 StatelessWidget类，因为所有状态都由其父组件处理
2.当检测到点击时，它会通知父组件
 */
class Exam_2 extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("父widget管理子widget的状态"),
      ),
      body: ParentWidget(),
    );
  }
  
}

//ParentWidget为TapboxB管理状态

class ParentWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _ParentWidgetState();
  }

}

class _ParentWidgetState extends State<ParentWidget>{
  bool _actice = false;

  void _handleTapboxChanged(bool newValue){
    setState(() {
      _actice = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Container(
      child: new TapboxB(
        active: _actice,
        onChanged: _handleTapboxChanged,
      ),
    );
  }

}

class TapboxB extends StatelessWidget{

  final bool active;
  final ValueChanged<bool> onChanged;

  TapboxB({Key key,this.active:false,@required this.onChanged})
    :super(key:key);

  void _handleTap(){
    onChanged(!active);
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new GestureDetector(
      onTap: _handleTap,
      child: new Container(
        child: new Center(
          child: new Text(
            active? 'Active':'Inactive',
            style: new TextStyle(fontSize: 32.0,color: Colors.white),
          ),
        ),
        width: 200.0,
        height: 200.0,
        decoration: new BoxDecoration(
          color: active ? Colors.lightGreen[700] :Colors.grey[600]
        ),
      ),
    );
  }

}